package myvolatile1;

/**
 * Created by L.jp
 * Description:
 * User: 86189
 * Date: 2022-08-08
 * Time: 9:08
 */
//使用结婚基金的故事来描述修改共享数据的问题
    //基金原本有10w,男孩女孩一开始都知道是10w,但是后来男孩取走了1w,就变成可9w,但是女孩不知道，
// 以为还是10w,以为她不知道男孩取了1w

    //程序问题 : 女孩虽然知道结婚基金是十万，但是当基金的余额发生变化的时候，女孩无法知道最新的余额。
    //所以要使用volatile解决可见性的问题
    
/*
案例出现的问题 :
当A线程修改了共享数据时，B线程没有及时获取到最新的值，如果还在使用原先的值，就会出现问题
 1，堆内存是唯一的，每一个线程都有自己的线程栈。
 2 ，每一个线程在使用堆里面变量的时候，都会先拷贝一份到变量的副本中。
 3 ，在线程中，每一次使用是从变量的副本中获取的。
 */
    //女孩线程一直从共享数据副本去取内容，一直执行读取操作，所以就导致了内存可见性的问题
    
public class Money {
    //   Volatile关键字 : 强制线程每次在使用的时候，都会看一下共享区域最新的值
    public static volatile int money=100000;
}
